package com.birdboot.core;

import com.birdboot.http.HttpServletRequest;
import com.birdboot.http.HttpServletResponse;

import javax.activation.MimetypesFileTypeMap;
import java.io.File;
import java.net.URISyntaxException;

/**
 * V8新增：
 * DispatcherServlet是由SpringMVC框架提供的一个Servlet类，用于Tomcat整合使用的类
 * 具体是接收处理请求的工作
 */
public class DispatcherServlet {
    //单例模式 (1)只需要一个实例、实例没有特殊属性（2）实例开销特别大
    private DispatcherServlet(){}
    private static DispatcherServlet instance = new DispatcherServlet();
    public static DispatcherServlet getInstance(){
        return instance;
    }

    private static File baseDir;
    private static File staticFile;
    static {
        try {
            baseDir = new File(DispatcherServlet.class.getClassLoader().getResource(".").toURI());// 定位类加载路径（固定写法）
            staticFile = new File(baseDir,"static");// 根据类加载路径定位static目录
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
    }

    public void service(HttpServletRequest request, HttpServletResponse response) {
        String path = request.getUri();
        System.out.println("抽象路径："+path);

        //File file = new File(staticFile,"index.html");// 根据static目录定位index.html页面
        File file = new File(staticFile,path);// 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例
            /*
            将浏览器发送的状态码和正文文件设置到响应对象中
            这样一来，第三步发送时，就会按照这里设置的信息发送给浏览器
             */


        if (file.isFile()) {
//                response.setStatusCode(200);
//                response.setStatusReason("OK");
            response.setContentFile(file);
            // 追加添加响应头操作
                // 已经在setContentFile()中完成
            response.addHeader("Server","BirdBoot");
        }else{
            response.setStatusCode(404);
            response.setStatusReason("NotFound");          // 状态代码
            file = new File(staticFile,"404.html");   // 状态描述
            response.setContentFile(file);// 不用设置Content-Type和 Content-Length了，应为在setContentFile中只要有正文就会设置
            response.addHeader("Server","BirdBoot");
        }
    }
}
